﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTableWidgetItem>

#include "QFile"
#include "QTextStream"
#include "ConvolutionNet.h"
#include "histogram_dialog.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QApplication* pApp, QWidget *parent = 0);
    ~MainWindow();

public slots:
    void needToUpdateForm();
    
private slots:
    void on_comboBox_N_inputs_currentIndexChanged(int index);

    void on_tableWidget_cellClicked(int row, int column);

    void updateField() const;

    void updateTrainingSet(); // обновление обуч. выборки

    vector<QString> getTrainingSamples(); // получение имён файлов из обуч. выборки

    void on_pushButton_RunEra_clicked();

    void on_action_saveFile();

    void on_action_openFile();

    void on_action_saveSampleFile();

    void on_action_openSampleFile();

    void on_listWidget_Neurons_doubleClicked(const QModelIndex &index);

    matrix fieldToMatrix(int N_inputs, int* pInputs)
    /*
     * ф-я для конвертации массива значений в матрицу
     * параметры:
     * N_inputs - число входов
     * pInputs - значения входов
     */
    {
        double* pArray = new double[N_inputs];

        for(int i = 0; i < N_inputs; i++)
        {
            pArray[i] = (double)pInputs[i];
        }

        matrix in_matrix = matrix(28, 1, pArray);

        delete[] pArray;

        return in_matrix;
    }

    void on_pushButton_getTrainingSet_clicked();

    void on_pushButton_clicked();

    void on_tableWidget_cellEntered(int row, int column);

    void on_pushButton_2_clicked();

    void on_pushButton_persLearning_clicked();

    void on_pushButton_convLearning_clicked();

private:
    QApplication* m_pApp;

    QString saveState();

    Ui::MainWindow *ui;

    int m_N_inputs;
    int* m_pInputs;
    QFile* m_logFile;
    QTextStream* m_log;
    convolution_net net;
    bool b_ActualTrainingSet;
    vector<pair<matrix, int> > trainingSet; // вектор для хранения обучающей выборки - матриц и ответа
};

#endif // MAINWINDOW_H
